package com.zysstudy.stream;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class practiceStreem3 {

    /**
    *
     * 1.嵌套集合展开：有一个 List<List<Integer>>，将其展开为单个 List<Integer>。
     *
     * 2.复杂对象转换：有一个 List<Order>，每个 Order有 orderId和 List<OrderItem>。提取所有订单中的所有商品名称（假设 OrderItem有 name）。
     *
     * 3.按条件分组并统计：将 List<User>按城市分组，并统计每组的用户数量。
     *
     * 4.自定义收集器：手动实现一个收集器，将 List<String>收集到一个用逗号连接的字符串（不用 Collectors.joining）。
     *
     * 5. 流的分页：从一个大的 List<Integer>中实现分页（取第 n 页，每页 m 条）。
     *
     * 6. 树形结构构建（类似你的代码）：有一个 List<Department>，每个部门有 id和 parentId，构建树形结构（返回根节点列表）。
     *
     * 7. 多重条件排序：对 List<User>先按年龄降序，再按姓名升序排序。
     *
     * 8. 并行流处理：用一个并行流计算一个大列表的和，并比较与串行流的性能差异。
     *
     * 9. 异常处理：在 map操作中调用的方法可能抛出异常，如何优雅地处理？
     *
     * 10.无限流与限制：生成一个无限随机数流，取出前 10 个偶数。®®®®
     */
    public static void main(String[] args) {

       practiceStreem3 p=  new practiceStreem3();
       p.p2();

    }

    //     * 1.嵌套集合展开：有一个 List<List<Integer>>，将其展开为单个 List<Integer>。
    private List<Integer> p1(){
        List<List<Integer>> list = Arrays.asList(Arrays.asList(1,2,3,4,5),Arrays.asList(1,2,3,4,5),Arrays.asList(9,8,7,6,5,4));
        List<Integer> res= list.stream().flatMap(List::stream).collect(Collectors.toList());
        return res;
    }

    // * 2.复杂对象转换：有一个 List<Order>，每个 Order有 orderId和 List<OrderItem>。提取所有订单中的所有商品名称（假设 OrderItem有 name）。

    private List<String> p2(){
        Order o1 = new Order();
        Order o2 = new Order();
        o1.setId(Long.valueOf(1));
        o1.setUserId(Long.valueOf(2));
        OrderItem i1 = new OrderItem();
        i1.setName("商品1");
        i1.setNum(1);
        i1.setGoodID(Long.valueOf(1));
        OrderItem i2 = new OrderItem();
        i2.setName("商品2");
        i2.setNum(1);
        i2.setGoodID(Long.valueOf(1));
        List<OrderItem> l1 = new ArrayList<>();
        List<OrderItem> l2 = new ArrayList<>();
        l1.add(i1);
        l2.add(i2);
        o1.setOrderItems(l1);
        o2.setOrderItems(l2);
        o2.setId(Long.valueOf(22));
        o2.setUserId(5L);
        System.out.println("打印查看订单1:"+o1);
        System.out.println("打印查看订单1:"+o2);
        List<Order> list = new ArrayList<>();
        list.add(o2);
        list.add(o1);
        List<String> res= list.stream().flatMap(o->o.getOrderItems().stream()).map(s->s.getName()).collect(Collectors.toList());
        System.out.println("实现1"+res);

        List<String> res2= new ArrayList<>();
        for(Order order : list){
            for (OrderItem item: order.getOrderItems()){
                res2.add(item.getName());
            }
        }
        System.out.println("实现2"+res2);
        return res;
    }
}
